#pragma once

#include "Duplicate/Duplicate.h"


//竞技场副本
class ArenaDuplicate : public Duplicate
{
public:
	////////////////////////////////  Duplicate  //////////////////////////////////////////
	//初始化
	virtual bool Init(uint32_t nDuplicateID, uint32_t nSceneID, IBrushMonster *pBrush);
	//
	virtual void UnInit();
	//是否能使用药物
	virtual bool CanUseItem() { return false; }; //竞技场副本不能使用药物
	//开始挑战
	virtual int32_t StartChallenge(CharIDType charId);
protected:
	virtual void OnReady_State();
	virtual void OnBegin_State();
	virtual void OnFinish_State();
	virtual void OnFlop_State();
	virtual void OnClean_State();
	virtual void OnDestory_State();
	//定时器更新
	virtual void OnTimerUpdate(uint32_t nTimerID);
	//执行事件
	virtual void OnExecuteEvent(uint16_t nEventID, uint32_t nSrcID, uint8_t bySrcType, void *pContext, int32_t nLen);
	//生物进入场景
	virtual void OnCreatureEnter(Creature *pCreature);
	//生物离开副本
	virtual void OnPlayerLeave(Player *pPlayer);
	//是否能进入
	virtual bool OnCanEnter(Creature *pCreature);
	//进入区域
	virtual bool OnEnterArea(uint32_t nAreaID);
	//复活
	virtual void OnRelive(Player *pPlayer, int8_t byType);
	//下线
	virtual void PlayerLogoutGame(Player *pPlayer);
	//主动离开副本之前 的处理 (目前主要针对竞技场)
	virtual void OnActiveBeforeLeave(CharIDType cid);
	//主动离开副本失败 处理 (目前主要针对竞技场)
	virtual void OnActiveLeaveFaild(CharIDType cid);
public:
	explicit ArenaDuplicate();
	virtual ~ArenaDuplicate();
private:
	//检查倒计时，10s倒计时放前端做，倒计时结束前端发送开始挑战，这里是为了避免前端长时间不发送开始挑战请求
	void CheckCountDown();
	uint32_t GetAddArenaScore(int32_t result, uint32_t arenaStraight);
	void NotifyCenterArenaResult(int32_t result);

private:
	bool m_bNotifyArena; //是否通知了竞技场
	//uint32_t m_historyRankId; //历史最高记录
	int32_t m_oldPkMode;	//玩家进入之前的PK模式
	int64_t m_oldhp;		//玩家进入之前的hp
	int64_t m_oldmp;		//玩家进入之前的mp
	bool m_bStart;			//是否开始挑战了
	bool m_bStartCountDown;	//是否开始倒计时
};